package com.frank.activedatabus.Core;

import com.frank.activedatabus.dispatch.ThreadMode;
import ohos.aafwk.ability.ILifecycle;


public interface Observable<T> {
    /**
     * 进程内发送消息 异步
     *
     * @param value 发送的消息
     */
    void post(T value);

    /**
     * 进程内发送消息，延迟发送，带生命周期
     * 如果发送消息的时候sender处于非激活状态，消息取消发送
     *
     * @param sender 消息发送者
     * @param value  发送的消息
     */

    void post(ILifecycle sender, T value);

    /**
     * 进程内发送消息，延迟发送
     *
     * @param value 发送的消息
     * @param delay 延迟毫秒数
     */

    void postDelay(T value, long delay);

    /**
     * 进程内发送消息，延迟发送，带生命周期
     * 如果延时发送消息的时候sender处于非激活状态，消息取消发送
     *
     * @param sender 消息发送者
     * @param value  发送的消息
     * @param delay  延迟毫秒数
     */

    void postDelay(ILifecycle sender, T value, long delay);


    /**
     * 注册一个Observer，生命周期感知，自动取消订阅
     *
     * @param owner              LifecycleOwner
     * @param dataChangeListener 事件发送以后的回调
     */

    void observe(ILifecycle owner, Observer<T> dataChangeListener);

    /**
     * 注册一个Observer，需手动解除绑定
     *
     * @param dataChangeListener 事件发送以后的回调
     */

    void observeForever(Observer dataChangeListener);

    /**
     * 通过observeForever或observeStickyForever注册的，需要调用该方法取消订阅
     *
     * @param observer 观察者
     */

    void removeObserver(Observer observer);

    Observable<T> withBackground(boolean always);

    Observable<T> withSticky(boolean sticky);

    Observable<T> withThreadMode(ThreadMode threadMode);
}
